package com.sky.proxy.staticProxy;

/**
 * date : 2020-08-20
 * 代理模式
 * 抽象主题（Subject）类：通过接口或抽象类声明真实主题和代理对象实现的业务方法。
 * 真实主题（Real Subject）类：实现了抽象主题中的具体业务，是代理对象所代表的真实对象，是最终要引用的对象。
 * 代理（Proxy）类：提供了与真实主题相同的接口，其内部含有对真实主题的引用，它可以访问、控制或扩展真实主题的功能;
 * 静态代理和装饰器模式很类似, 只能说侧重不同;
 *
 * @author : wushikai
 */

interface Subject {

    void request();
}


/*真实主题*/
class RealSubject implements Subject {

    @Override
    public void request() {
        System.out.println("真实主题方法");
    }
}

public class Proxy implements Subject {


    private RealSubject realSubject;

    public void preRequest() {
        System.out.println("访问真实主题之前的预处理。");
    }

    public void postRequest() {
        System.out.println("访问真实主题之后的后续处理。");
    }

    @Override
    public void request() {
        if (realSubject == null) {
            realSubject = new RealSubject();
        }
        preRequest();
        realSubject.request();
        postRequest();
    }
}


class Client {

    public static void main(String[] args) {
        Proxy proxy = new Proxy();
        proxy.request();
    }


}
